IsTuple<T>
定義
code:ts
type IsTuple<T>
= T[] extends never[] ? false
: T extends readonly unknown[]
? false
: true
: false;
何をやってるか
通常の配列(T = unknown[])の場合、T['length']はnumberになる
tupleの場合、T['length']は、0, 1, 2, .. といったリテラルになる
なのでこれをnumber extends T['length']で見たときに
number extends numberならtrue判定だし、
number extends 1ならfalse判定になる
ほしい結果は逆なので.. ? false : trueと書けばok
もっと明示的に書くなら
code:ts
// prettier-ignore;
type IsTuple<T>
= T[] extends never[] ? false // neverでない
: T extends [] ? true // []はok
: T extends readonly unknown[] ? true // readonlyもちろんok
: T extends unknown[] ? false // T[]はtupleじゃない
: false;
可読性が圧倒的に高いので、普段遣いするならこっちだろうねmrsekut.icon
テストケース
code:ts
type cases = [
Expect<Equal<IsTuple<[]>, true>>,
Expect<Equal<IsTuple<number>, true>>, Expect<Equal<IsTuple<readonly 1>, true>>, Expect<Equal<IsTuple<{ length: 1 }>, false>>,
Expect<Equal<IsTuple<number[]>, false>>,
Expect<Equal<IsTuple<never>, false>>,
];